package com.jt.controller;

import com.jt.mapper.UserMapper;
import com.jt.pojo.User;
import com.jt.service.UserService;
import com.jt.service.UserServiceImpl;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;

import java.util.List;

/**
 * @author Amos
 * @date 2021/10/8
 */

@RestController // 是下面两个注解的结合
//@Controller
//@ResponseBody // 将服务器返回的数据转换成Json字符串
@CrossOrigin
public class UserController {

    @Autowired
    private UserService userService;

    @RequestMapping("/findAll")
    public List<User> findAll() {
        return userService.findAll();
    }

    // 根据id查询用户信息
//    @RequestMapping(value = "/findById/{id}", method = RequestMethod.GET) // 默认是get
    @GetMapping("findById") // 只接收get请求
    public User findById(Integer id) {
        return userService.findById(id);
    }

    // 根据id查询用户信息
//    @RequestMapping(value = "/findById/{id}", method = RequestMethod.GET) // 默认是get
    @GetMapping("findById2/{id}") // 只接收get请求 改造成了restful的方式
    public User findById2(@PathVariable Integer id) {
        return userService.findById(id);
    }

    // 需求2：查询name="王昭君" sex="女"的数据
    @GetMapping("findByNameAndSex")
    public List<User> findByNameAndSex(String name, String sex) {
        return userService.findByNameAndSex(name, sex);
    }

    // 需求2实现的优化
    /**
     * 利用对象传参
     * 规则：SpringMVC可以利用对象的方式接收url传过来的参数
     * 底层实现： 参数name="xxx" 拼接set形成setName，之后检查对象中
     * 是否有对应的setName(), 如果匹配该方法，则为对象赋值
     *
     * URL地址：http://localhost:8080/findUserByNS?name=王昭君&sex=女
     * 参数： name=xxx&sex=xxx
     * 返回值：List<User>
     */
    @GetMapping("/findUserByNS")
    public List<User> findUserByNS(User user) {
        return userService.findUserByNS(user);
    }

    /**
     * 规则：如果参数使用"，"分隔，则SpringMVC可以自动的转化为数组
     * 查询多个用户
     * restful的url中不能出现动词
     * URL：http://localhost:8080/getUserByIds?ids=1,3,4,5
     * 返回值：List<User>
     */
    @GetMapping("/getUserByIds")
    public List<User> getUserByIds(Integer[] ids) {
        return userService.getUserByIds(ids);
    }

    /**
     * 需求：实现用户入库操作
     * URL: http://localhost:8080/axios/saveUser
     * 参数：{name: "小燕子", age: 18, sex: "女"}
     * 返回值：String 新增成功！！！
     * 难点：
     *      json 互转 user对象
     *      1. user对象转json @ResponseBody
     *      2. json转化为user对象 @RequestBody
     */
    @PostMapping("/axios/saveUser")
    public String saveUser(@RequestBody User user) {
        userService.saveUser(user);
        return "新增用户成功！！！";
    }

    @PutMapping("/axios/updateUser")
    public String updateUser(@RequestBody User user) {
        userService.updateUser(user);
        return "更新用户成功！！！";
    }

    /**
     * 需求2：要求将name="小燕子"
     *      改为name="小鬼当家",age=18,sex=男
     *      难点：如果有多个参数，并且重复时，如何封装？
     *      解决方案： restful + 对象
     *      注意事项：restFul可以为对象的属性赋值
     *          注意restFul的名称不要与属性重名，否则会覆盖
     *          引发BUG
     */
    @PutMapping("/axios/updateUserByName/{whereName}")
    public String updateUserByName(@RequestBody User user,
                                   @PathVariable String whereName) {
        userService.updateUserByName(user, whereName);
        return "通过用户名更新对象成功！！！";
    }
}
